package com.qijia.common.dao;

import java.util.List;

import com.qijia.common.domain.BaseData;
import com.qijia.common.domain.example.BaseExample;
import com.qijia.common.utils.PageUtil;

/**
 * 数据库基本操作Dao接口
 * @author Administrator
 *
 * @param <T>
 */
public interface BaseDao<T extends BaseData> {

	/**
	 * 获取主键
	 * 
	 * @param t
	 * @return
	 */
	Object getPkKey();

	/**
	 * 增加一条记录
	 * 
	 * @param t
	 *            记录实体
	 * @return 实体的主键
	 */
	void save(T t);

	/**
	 * 增加一组记录集
	 * 
	 * @param t
	 *            记录集
	 * @return 记录集对应的主键
	 */
	List<Object> mutiSave(List<T> t);

	/**
	 * 更新一条记录，以key Id为条件
	 * 
	 * @param t
	 *            记录实体
	 * @return
	 */
	int updateByPrimaryKeySelective(T t);

	/**
	 * 根据条件构造器更新记录集
	 * 
	 * @param example
	 *            条件构造器
	 * @return 更新操作影响的记录数
	 */
	int updateByPrimaryKey(T t);
	
	/**
	 * 
	 * @param record
	 * @param example
	 * @return
	 */
	int updateByExampleSelective(T record, BaseExample example);

	/**
	 * 
	 * @param record
	 * @param example
	 * @return
	 */
    int updateByExample(T record, BaseExample example);

	/**
	 * 
	 * 根据条件构造器删除记录集
	 * 
	 * @param example
	 *            条件构造器
	 * @return 删除操作影响的记录数
	 */
	int delByExampleSelective(BaseExample example);

	/**
	 * 根据主键来删除一条记录
	 * 
	 * @param key
	 *            给定的主键
	 */
	void delByPrimaryKey(Object key);

	/**
	 * 根据一组主键来删除一组记录
	 * 
	 * @param keys
	 *            给定的主键集
	 */
	void mutiDel(List<Object> keys);

	/**
	 * 根据给定的条件统计出记录数
	 * 
	 * @param example
	 * @return
	 */
	int countByExample(BaseExample example);

	/**
	 * 根据条件获取一组T实体集
	 * 
	 * @param example
	 *            条件
	 * @return
	 */
	List<T> selectByExample(BaseExample example);

	/**
	 * 根据分页辅助组件获取装配好的分页组件
	 * 
	 * @param page
	 *            分页组件
	 * @return
	 */
	PageUtil selectForPage(PageUtil page);

	/**
	 * 根据主键获取对应的实体
	 * 
	 * @param key
	 *            主键
	 * @return
	 */
	T getObjectByKey(Object key);

	/**
	 * 根据条件获取最近的添加的实体 order by create time
	 * 
	 * @param example
	 *            条件
	 * @return
	 */
	T getLastObjectByExample(BaseExample example);
}
